#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <string.h>

//int main()
//{
//	//c中存放各字符串的首地址
//	char* c[] = { "ENTER","NEW","POINT","FIRST" };
//	//c+3 F的地址，c+2 P 的地址，c+1 N 的地址 c E 的地址
//	char** cp[] = { c + 3,c + 2,c + 1,c };
//	//cpp指向c+3，cpp+1指向 c+2，cpp+2指向 c+1 ，cpp+3 指向 c
//	char*** cpp = cp;
//	//++cpp,
//	//假设一个一级指针，指针++，就是它所指向的地址+1，
//	//++cpp,就是cpp指向的地址+1
//	printf("%s\n", **++cpp);//POINT
//	printf("%s\n", *-- * ++cpp + 3);//ER
//	//cpp[-2]等价于*(cpp-2)
//	printf("%s\n", *cpp[-2] + 3);//ENTER
//	printf("%s\n", cpp[-1][-1] + 1);
//	return 0;
//}


//模拟实现strlen
// 第一种
//int my_strlen(const char* p)
//{
//	传过来的是指针，要先判断是否为空指针
//	assert(p != NULL);
//	int length = 0;
//	while (*p!='\0')
//	{
//		length++;
//		p++;
//	}
//	return length;
//}
//int main()
//{
//	char arr[] = "abcdef";
//	int length=my_strlen(arr);
//	printf("%d\n",length);
//	return 0;
//}

//采用递归 的方式
//第二种
//int my_strlen(const char* p)
//{
//	//传过来的是指针，要先判断是否为空指针
//	assert(p != NULL);
//	int length = 0;
//	if (*p!='\0')
//	{
//		return 1 + my_strlen(p + 1);
//	}
//	else
//	{
//		return 0;
//	}
//}
//int main()
//{
//	char arr[] = "abcdef";
//	int length = my_strlen(arr);
//	printf("%d\n", length);
//	return 0;
//}

//指针-指针
//第三种
//int my_strlen(const char* p)
//{
//	//传过来的是指针，要先判断是否为空指针
//	assert(p != NULL);
//	//把p指针的初始地址交给另外一个指针
//	const char* start= p;
//	while (*p!='\0')
//	{
//		p++;
//	}
//	return p - start;
//}
//int main()
//{
//	char arr[] = "abcdef";
//	int length = my_strlen(arr);
//	printf("%d\n", length);
//	return 0;
//}

//size_t是无符号的整型
//typedef unsigned int size_t

//int main()
//{
//	//3-6=-3,但是-3是一个无符号数，在内存中，会被当作一个非常大的正数
//	if (strlen("abc")-strlen("abcdef")>0)
//	{
//		printf(">\n");
//	}
//	else
//	{
//		printf("<\n");
//	}
//	return 0;
//}

//int main()
//{
//	//常量字符串不可以被修改，而数组可以被修改
//	char arr1[] = {"qwertyuio"};
//	char* p = "abcdefghijk";
//
//	char arr2[] = {"hello bit"};
//	strcpy(arr1,arr2);
//	return 0;
//}


//模拟实现strcpy
char* my_strcpy(char* destination,const char* resource)
{
	assert(destination&&resource);
	char* ret = destination;
	//赋值表达式的返回值是表达式的左值
	while (*destination++ = *resource++)
	{
		;
	}
	//有返回值的，返回值是目的地址的首地址
	return ret;
}
int main()
{
	char arr1[] = "abcdefghijk";
	char arr2[] = "hello bit";
	my_strcpy(arr1,arr2);
	printf("%s\n",arr1);
	return 0;
}